package com.guodi.model.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.guodi.model.dto.req.AvtReportIdtExcelReqDTO;
import com.guodi.model.entity.IdtReportValue;
import com.guodi.model.entity.IdtWarnRule;
import com.guodi.model.entity.IdtYearRelevance;
import com.guodi.model.vo.ApiIndicatorsValue;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * @描述：指标上报值表 服务类
 * @作者: 彭辉
 * @日期: 2020-06-05
 */
public interface IIdtReportValueService extends IService<IdtReportValue> {

    /**
     * 获取指标上报的所有年份值列表
     * @入参: idtTypeCode 指标体系编码
     * @入参: divisionCode 行政区划编码
     * @入参: orgId 组织单位id
     * @出参: 指标上报的所有年份值列表
     */
    List<Integer> listIdtReportYear(String idtTypeCode, String divisionCode, String orgId, String idtTypeId);
    /**
     * @描述:根据关键字搜索
     * @入参:
     * @出参:
     * @作者: 戴伙进
     * @日期: 2020/6/17 12:09
     **/
    List<IdtReportValue> listByKeyWord(String keyWord, Integer year, long pageSize, long start, String sort, String sortWay, String divisionCode, String orgId);

    /**
     * @描述:关键字搜索查询的总记录数
     * @入参:
     * @出参:
     * @作者: 戴伙进
     * @日期: 2020/6/17 15:08
     **/
    Integer listByKeyWordCount(String keyWord, String orgId);

    /**
     * @描述:关键字、行政区划搜索查询的总记录数
     * @入参:
     * @出参:
     * @作者: 汤厚韬
     * @日期: 2020/12/22 16:08
     **/
    Integer listByKeyWordAndCodeCount(String keyWord, Integer year, String divisionCode, String orgId);

    /**
     * @描述:通过行政编码获取行政区名称
     * @入参:
     * @出参:
     * @作者: 戴伙进
     * @日期: 2020/6/18 15:42
     **/
    String getNameByDivisionCode(String divisionCode);

    /**
    * @描述:判断上报值是否达标（预警规则反向，上报值小于等于规划值则达标。预警规则正向，上报值大于或等于规划值则达标）
    * @入参:
    * @出参:
    * @作者: 郑文彬
    * @日期: 2020/7/18 15:21
    **/
    public Integer isStandard(String indicatorsId, String year, String area, String reportValue);

    /**
     * @描述:判断上报值是否统一（上报值等于监测值则统一）
     * @入参:
     * @出参:
     * @作者: 郑文彬
     * @日期: 2020/7/18 15:21
     **/
    public Integer isUnify(String indicatorsId, String year, String area, String reportValue);

    /**
     * @描述:查询指标对标配置
     * @入参:
     * @出参:
     * @作者: 郑文彬
     * @日期: 2020/7/18 15:21
     **/
    public IdtYearRelevance queryYearRelevances(String indicatorsId, String year);

    /**
     * @描述:更新上报值的统一率字段一（上报值等于监测值则统一）
     * @入参:
     * @出参:
     * @作者: 郑文彬
     * @日期: 2020/7/18 15:21
     **/
    public void updateUnify(String indicatorsId, String year, String area);

    /**
     * @描述:更新上报值的达标率字段（根据预警规划、上报值、规划值判断是否符合达标）
     * @入参:
     * @出参:
     * @作者: 郑文彬
     * @日期: 2020/7/18 15:21
     **/
    public void updateStandard(String indicatorsId, String area, String targetYear, String targetValue);

    /**
     * @描述: 根据指标ID和预警规则，更新监测值的预警状态、上报值的达标状态
     * @入参:
     * @出参:
     * @作者: 汤厚韬
     * @日期: 2021/2/1 16:01
     **/
    void updateWarnStatusAndStandard(String indicatorsId, IdtWarnRule idtWarnRule);

    /**
    * @描述: 获取指标上报值历史数据
    * @入参:
    * @出参:
    * @作者: 代鹏刚
    * @日期: 2020/11/7 13:23
    **/
    List<IdtReportValue> getHistoryList(String indicatorsId, List<Integer> yearList, String divisionCode);

    /**
    * @描述: 获取当前指标最新的年份数据
    * @入参:
    * @出参:
    * @作者: 代鹏刚
    * @日期: 2020/11/7 16:01
    **/
    List<IdtReportValue> getNewestData(String indicatorsId);

    /**
     * @描述：根据指标体系编码、年份、行政区划代码查询指标数值
     * @作者：彭辉
     * @日期：2020/12/8 16:34
     **/
    List<ApiIndicatorsValue> listCurrentAssessmentData(Integer year, String divisionCode, List<String> indicatorsList);

    /**
     * @描述：根据指标编码、年份、行政区划代码查询因子值
     * @作者：汤厚韬
     * @日期：2021/1/25
     **/
    List<IdtReportValue> listByIndicatorsIds(List<String> calculateFactorNameList, Integer time, String divisionCode);

//    /**
//     * @描述: 根据AvtIndicatorsReportValue列表, 批量修改获取新增idt_report_value的数据
//     * @入参:
//     * @出参:
//     * @作者: 余家鑫
//     * @日期: 2021/7/20 下午5:53
//     */
//    @Transactional(rollbackFor = {RuntimeException.class, Exception.class})
//    void batchUpdateByAvtIndicatorsReportValues(List<AvtIndicatorsReportValue> avtIndicatorsReportValues, boolean coverIdt);

    /**
     * @描述: 市县级别系统, 导入zip包成果的时候, 根据导入的AvtReportIdtExcelReqDTO列表, 批量修改或者新增idt_report_value的数据
     * @入参:
     * @出参:
     * @作者: 余家鑫
     * @日期: 2021/9/7 上午9:09
     */
    @Transactional(rollbackFor = {RuntimeException.class, Exception.class})
    void batchUpdateByAvtReportIdtExcelReqDTOs(List<AvtReportIdtExcelReqDTO> avtReportIdtExcelReqDTOs, boolean coverIdt);


    /**
     * @描述: 市县级别系统, 导入zip包成果的时候, 根据导入的AvtReportIdtExcelReqDTO列表, 校验指标是否存在
     * @入参:
     * @出参:
     * @作者: 余家鑫
     * @日期: 2021/10/27 上午11:13
     */
    Boolean checkIdtExistsByAvtReportIdtExcelReqDTOs(List<AvtReportIdtExcelReqDTO> avtReportIdtExcelReqDTOs);

//    /**
//     * @描述: 根据AvtIndicatorsReportValue列表 判断指标是否存在
//     * @入参:
//     * @出参:
//     * @作者: 余家鑫
//     * @日期: 2021/10/27 上午11:43
//     */
//    Boolean checkIdtExistsByAvtIndicatorsReportValues(List<AvtIndicatorsReportValue> avtIndicatorsReportValues);

    /**
     * 计算指标预警状态
     * @param indicatorsId 指标id
     * @param reportValue 评估值
     * @param year 上报年份
     * @param divisionCode 行政区划编码
     * @return 预警状态，例如：预警
     * @author 陈宏成
     * @date 2021-12-30
     */
    String getWarnStatus(String indicatorsId, String reportValue, String year, String divisionCode) ;
}
